/* 进行模块真正的业务处理 */
const mysql = require('mysql')
const path = require('path')
const jwt = require('jsonwebtoken')
const fs = require('fs')
//实现文件上传的模块引用
const formidable = require('formidable')


/* 创建一个连接并添加配置 */
const con = mysql.createPool({
  host: 'localhost',
  user: 'root',
  password: '123456',
  database: 'mybase'
})
//暴露
module.exports = {

  /* 1.0 响应所有的英雄数据 get / getalldata */
  getalldata: function (req, res) {

    /* 1.1 创建sql语句 */
    let sql = 'select * from heros where isdel = 0'

    /* 1.2 调用方法执行sql语句并接收处理结果 */
    con.query(sql, (err, results) => {
      if (err) {
        res.json({
          code: 500,
          msg: '数据查询失败,请重试'
        })
      } else {
        res.json({
          code: 200,
          msg: '数据查询成功',
          data: results
        })
      }
    })
  },

  /* 2.0 实现文件上传 */
  uploadFile: function (req, res) {

    /* 2.1 创建文件上传对象 */
    const form = formidable()
    //2.1.1 配置上传文件的存放目录,一定要设置绝对路径
    form.uploadDir = __dirname + '/public/images'
    //2.1.2 配置保留扩展名
    form.keepExtensions = true   //为false也不影响上传功能,只是上传数据的扩展名没有了
    //2.1.3 实现文件上传
    //req:上传文件需要获取到用户所传递的数据及其他的相关信息
    //上传完成之后,就自动调用所传入的回调函数,同时给这个回调传入三个参数
    //        err: 上传文件失败的错误信息对象
    //        fields: 本次传递普通的键值对,是一个对象,没传是空对象
    //        files: 这是当前上传文件的原始信息和上传成功之后的服务器端的文件信息

    form.parse(req, (err, fields, files) => {
      if (err) {
        res.json({ code: 500, msg: '文件上传失败' })
      } else {
        // console.log(files);
        // console.log(files.img.path);
        // 得 E:\前端与移动开发\02-就业班\02- 业务型\11-node\06-node案例第6天\03-随堂练习\code\public\images\upload_f7d6dcbd673861c3d0d9ea20ddbfc0ce.jpg

        //使用path模块的basename 获取路径的最后一部分
        // console.log(path.basename(files.img.path));
        // 得 upload_f7d6dcbd673861c3d0d9ea20ddbfc0ce.jpg

        res.json({
          code: 200,
          msg: '上传文件成功',
          //返回文件上传服务器后文件的名称
          img: path.basename(files.img.path)
        })
      }
    })
  },

  /* 3.0 新增用户的英雄数据 */
  add: function (req, res) {

    /* 3.1 接收参数 参数值来与隐藏域*/
    // console.log(req.body);  //对象
    //判断参数是否为空
    if (!req.body.name) {
      res.json({ code: 400, msg: 'name参数输入错误' })
    }

    /* 3.2 创建sql 语句 */
    let sql = 'insert into heros set ?'

    /* 3.3 调用方法执行sql语句并接收处理结果 */
    con.query(sql, req.body, (err) => {
      if (err) {
        res.json({
          code: 500,
          msg: '数据添加失败,请重试'
        })
      } else {
        res.json({
          code: 200,
          msg: '数据添加成功',
        })
      }
    })
  },

  /* 4.0 根据id 获取相应的英雄数据 */
  getHeroById: function (req, res) {

    /* 4.1 获取id */
    let id = req.query.id
    // console.log(id);

    /* 4.2 创建sql语句 */
    let sql = 'select * from heros where id=' + id

    /* 4.3 调用方法执行sql语句并接收处理结果 */
    con.query(sql, (err, results) => {
      if (err) {
        res.json({
          code: 500,
          msg: '该id数据查询失败,请重试'
        })
      } else {
        res.json({
          code: 200,
          msg: '该id数据查询成功',
          //results 返回的是结果集,对应的数据类型是数据
          //而id 是唯一的,查询只会返回1条数据,在后台获取这数据对象进行响应,而不是直接响应数组
          //所以获取的数组进行取值[0],获得的是数组中的data对象,方便前台使用
          data: results[0]
        })
      }
    })
  },

  /* 5.0 编辑英雄数据 */
  edit: function (req, res) {

    /* 5.1 接收参数*/
    // console.log(req.body);
    //判断id是否为空,空会修改所有的数据
    if (!req.body.id) {
      return res.json({ code: 400, msg: 'id参数不正确' })
    }

    /* 5.2 创建sql语句 */
    let sql = 'update heros set ? where id = ?'

    /* 5.3 调用方法执行sql语句并接收处理结果 */
    con.query(sql, [req.body, req.body.id], (err) => {
      if (err) {
        res.json({
          code: 500,
          msg: '修改查询失败,请重试'
        })
      } else {
        res.json({
          code: 200,
          msg: '修改查询成功'
        })
      }
    })
  },

  /* 6.0 删除英雄数据(软删除) */
  delete: function (req, res) {
    //通过修改信息中的isdel的值为1,实现软删除(用户看不见)

    /* 6.1 接收 id 值 */
    let id = req.query.id

    /* 6.2 创建sql语句  字符串的拼接*/
    let sql = 'update heros set isdel= 1 where id =' + id

    /* 6.3 调用方法执行sql语句并接收处理结果 */
    con.query(sql, (err) => {
      if (err) {
        res.json({
          code: 500,
          msg: '删除失败'
        })
      } else {
        res.json({
          code: 200,
          msg: '删除成功'
        })
      }
    })
  },

  /* 7.0 响应登录页面 */
  getHeropage: function (req, res) {
    fs.readFile(path.join(__dirname, '/views/login.html'), (err, data) => {
      if (err) return res.json({ code: 400 })
      res.end(data)
    })
  },

  /* 8.0 实现登录验证 */
  login: function (req, res) {
    //8.1 接收数据
    let obj = req.body
    // console.log(obj);
    //8.2 创建sql 语句 获取相对应的username
    let sql = 'select * from manager where username = ?'

    //8.3 进行执行
    con.query(sql, [obj.username], (err, results) => {
      if (err) {
        console.log(err);
        res.json({ code: 500, msg: '服务器异常,请重试' })
      } else {
        //8.4 判断获取的用户名是否有值
        if (results.length == 0) {
          res.json({ code: 500, msg: '用户不存在' })
        } else {
          //8.5 有值 再判断用户的密码是否正确
          //正确
          // console.log(obj);
          // console.log(results[0]);
          // console.log(results);
          if (results[0].password == obj.password) {
            //生成token
            //sign :生成token 的第三方模块
            //sign :用户自定义数据,密钥,配置
            const token = jwt.sign({ username: results[0].username }, 'hero', { expiresIn: '3000s' })
            res.json({ code: 200, msg: '登陆成功', token: token })
          } else {
            //不正确
            res.json({ code: 500, msg: '密码错误' })
          }
        }
      }
    })
  }
}
